#ifndef DTU_AT_COMMAND_H
#define DTU_AT_COMMAND_H

#include "dtu_common.h"

/* AT命令结果枚举 */
typedef enum {
    AT_RESULT_OK = 0,         /* 命令执行成功 */
    AT_RESULT_ERROR = 1,      /* 命令执行错误 */
    AT_RESULT_INVALID = 2,    /* 无效命令 */
    AT_RESULT_TIMEOUT = 3,    /* 命令超时 */
    AT_RESULT_BUSY = 4        /* 系统忙 */
} at_result_t;

/* AT命令类型枚举 */
typedef enum {
    AT_CMD_TYPE_TEST = 0,     /* 测试命令 AT+CMD=? */
    AT_CMD_TYPE_QUERY = 1,    /* 查询命令 AT+CMD? */
    AT_CMD_TYPE_SET = 2,      /* 设置命令 AT+CMD=<value> */
    AT_CMD_TYPE_EXECUTE = 3   /* 执行命令 AT+CMD */
} at_cmd_type_t;

/* AT命令参数结构 */
typedef struct {
    char* params[16];         /* 参数数组 */
    int param_count;          /* 参数数量 */
} at_cmd_params_t;

/* AT命令响应结构 */
typedef struct {
    at_result_t result;       /* 执行结果 */
    char response[1024];      /* 响应内容 */
    size_t response_length;   /* 响应长度 */
} at_cmd_response_t;

/* AT命令处理器函数类型 */
typedef at_result_t (*at_cmd_handler_t)(at_cmd_type_t type, const at_cmd_params_t* params, 
                                        at_cmd_response_t* response, void* user_data);

/* AT命令项结构 */
typedef struct at_cmd_item {
    char name[32];            /* 命令名称 */
    char description[128];    /* 命令描述 */
    at_cmd_handler_t handler; /* 处理函数 */
    void* user_data;          /* 用户数据 */
    bool enabled;             /* 是否启用 */
    struct at_cmd_item* next; /* 下一个命令项 */
} at_cmd_item_t;

/* AT命令解析器结构 */
typedef struct {
    at_cmd_item_t* commands;  /* 命令链表 */
    pthread_mutex_t mutex;    /* 互斥锁 */
    bool initialized;         /* 初始化标志 */
    uint32_t command_count;   /* 命令总数 */
    uint32_t execute_count;   /* 执行次数 */
    uint32_t error_count;     /* 错误次数 */
} at_cmd_parser_t;

/* AT命令统计信息 */
typedef struct {
    uint32_t total_commands;  /* 总命令数 */
    uint32_t executed_commands; /* 已执行命令数 */
    uint32_t successful_commands; /* 成功命令数 */
    uint32_t failed_commands; /* 失败命令数 */
    time_t last_execute_time; /* 最后执行时间 */
} at_cmd_stats_t;

/* 函数声明 */

/**
 * @brief 初始化AT命令解析器
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_at_init(void);

/**
 * @brief 销毁AT命令解析器
 */
void dtu_at_cleanup(void);

/**
 * @brief 注册AT命令
 * @param name 命令名称
 * @param description 命令描述
 * @param handler 处理函数
 * @param user_data 用户数据
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_at_register_command(const char* name, const char* description,
                                    at_cmd_handler_t handler, void* user_data);

/**
 * @brief 注销AT命令
 * @param name 命令名称
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_at_unregister_command(const char* name);

/**
 * @brief 启用AT命令
 * @param name 命令名称
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_at_enable_command(const char* name);

/**
 * @brief 禁用AT命令
 * @param name 命令名称
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_at_disable_command(const char* name);

/**
 * @brief 执行AT命令
 * @param command_line 命令行字符串
 * @param response 输出响应结构
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_at_execute(const char* command_line, at_cmd_response_t* response);

/**
 * @brief 解析AT命令行
 * @param command_line 命令行字符串
 * @param name 输出命令名称
 * @param name_size 命令名称缓冲区大小
 * @param type 输出命令类型
 * @param params 输出参数结构
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_at_parse_command(const char* command_line, char* name, size_t name_size,
                                 at_cmd_type_t* type, at_cmd_params_t* params);

/**
 * @brief 格式化AT响应
 * @param response 响应结构
 * @param format 格式字符串
 * @param ... 可变参数
 */
void dtu_at_format_response(at_cmd_response_t* response, const char* format, ...);

/**
 * @brief 设置AT响应结果
 * @param response 响应结构
 * @param result 执行结果
 * @param message 响应消息
 */
void dtu_at_set_response(at_cmd_response_t* response, at_result_t result, const char* message);

/**
 * @brief 获取AT命令列表
 * @param commands 输出命令数组
 * @param max_count 最大命令数量
 * @return 实际命令数量
 */
int dtu_at_get_command_list(at_cmd_item_t* commands, int max_count);

/**
 * @brief 检查AT命令是否存在
 * @param name 命令名称
 * @return true 存在，false 不存在
 */
bool dtu_at_command_exists(const char* name);

/**
 * @brief 获取AT命令信息
 * @param name 命令名称
 * @param command 输出命令信息
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_at_get_command_info(const char* name, at_cmd_item_t* command);

/**
 * @brief 获取AT命令统计信息
 * @param stats 输出统计信息
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_at_get_stats(at_cmd_stats_t* stats);

/**
 * @brief 重置AT命令统计信息
 */
void dtu_at_reset_stats(void);

/**
 * @brief 获取AT结果字符串
 * @param result AT结果
 * @return 结果字符串
 */
const char* dtu_at_result_string(at_result_t result);

/**
 * @brief 获取AT命令类型字符串
 * @param type 命令类型
 * @return 类型字符串
 */
const char* dtu_at_type_string(at_cmd_type_t type);

/**
 * @brief 释放AT命令参数
 * @param params 参数结构
 */
void dtu_at_free_params(at_cmd_params_t* params);

/**
 * @brief 复制AT命令参数
 * @param dst 目标参数结构
 * @param src 源参数结构
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_at_copy_params(at_cmd_params_t* dst, const at_cmd_params_t* src);

/* 标准AT命令处理器声明 */
at_result_t dtu_at_cmd_basic(at_cmd_type_t type, const at_cmd_params_t* params, 
                             at_cmd_response_t* response, void* user_data);
at_result_t dtu_at_cmd_info(at_cmd_type_t type, const at_cmd_params_t* params, 
                            at_cmd_response_t* response, void* user_data);
at_result_t dtu_at_cmd_reset(at_cmd_type_t type, const at_cmd_params_t* params, 
                             at_cmd_response_t* response, void* user_data);
at_result_t dtu_at_cmd_config(at_cmd_type_t type, const at_cmd_params_t* params, 
                              at_cmd_response_t* response, void* user_data);
at_result_t dtu_at_cmd_network(at_cmd_type_t type, const at_cmd_params_t* params, 
                               at_cmd_response_t* response, void* user_data);
at_result_t dtu_at_cmd_serial(at_cmd_type_t type, const at_cmd_params_t* params, 
                              at_cmd_response_t* response, void* user_data);
at_result_t dtu_at_cmd_collect(at_cmd_type_t type, const at_cmd_params_t* params, 
                               at_cmd_response_t* response, void* user_data);
at_result_t dtu_at_cmd_push(at_cmd_type_t type, const at_cmd_params_t* params, 
                            at_cmd_response_t* response, void* user_data);

#endif /* DTU_AT_COMMAND_H */
